//지금은 트라이와 캐치, 콜스텍 매커니즘만 익히면 된다.

package exception.basic;

public class ExceptionTest3 {

	public void worker(){
		String s = null;
		//s.concat("20");//nullpotinterexception 발생
		int arr[] = {10,20,30};
		Object o = "하하하";
		
		try {
		int ii = 10/0;//ArithmeticException 발생 ->어떤 캐취도 이 에러를 잡지 못했고 결국 메인메소드까지 에러가 날라간다. 메인메소드에서도 에러를 못잡고 이 에러는 JVM으로 가서 그 에러 객체를 JVM이 출력한다. 
		Integer i = (Integer)o;//ClassCastException 발생
		System.out.println(arr[5]);//ArrayIndexOutofBoundException 발생
		s.concat("20");//NullPointerException 발생
		} catch(ClassCastException e){
			System.out.println("catch - 캐스팅 잘못했습니다.");
		} catch(ArrayIndexOutOfBoundsException a){
			System.out.println("catch - 배열 index 범위를 넘어갔습니다.");
		} catch(NullPointerException c){
			System.out.println("Null - 참조값이 없습니다.");
		} catch(Exception e){//모든 예외를 붙잡을 수 있는 마법의 비법!, 근데 이건 마지막에 넣어야 한다. 하위타입의 exception이 존재하면 안된다.
			//상식적으로 생각해봐, 모든 예외를 잡을 수 있는 놈을 맨 위에 다가 올려봐 그럼 걔가 다 잡을꺼 아냐, 그럴거면 뭐하러 써? 그러니까 
			//저 모든 예외를 잡을 수 있는 exception의 아래에는 하위 익셉션 타입이 존재하면 안된다.
			System.out.println("예외가 발생했습니다.");
		}
		//이런식으로 트라이 캐취 구문을 이어서 작성 가능하다.
		//그런데 이렇게 해서 잡은 에러 객체는 어디로가는거지? 
		//e, c, a 로 받은 이 익셉션 객체들은 어떻게 되는거지? 어디로 가는거지? 
		
		System.out.println("worker메소드 종료");
	}
	//일반적인 상황에서 위와 같이 오류 투성이인 코드가 쭉 나열되었을때 첫번째 줄이 실행되야 다음줄이 실행된다.
	//익셉션이 날 코드가 여러개일 경우 try는 그냥 통으로 묶어 버릴 수 있다. 
	//근데 언제 저렇게 묶어서 에러를 처리할까? 보통 하나가 문제가 생기면 다음줄은 실행할 필요가 없을때 그렇게 관련있는 것들끼리 묶어서 처리한다.
	//1, 줄이 실행되야 2번째 줄이 실행할 의미가 있는 것들, 예를 들어 그런것들을 묶는거지 
	
	public static void main(String[] args) {
		new ExceptionTest3().worker();
		System.out.println("메인 종료");
		//결과값이 왜 저렇게 나오는지 이해하는게 중요하다. 
	}
	
}
